package com.tedu.demo;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Test02_Method {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //下面的method方法只能获取带public修饰的资源
        //method();//获取class对象
        //method1();//获取构造方法
        //method2();//获取成员方法
        //method3();//获取成员变量
        method4();//通过反射创建对象
    }

    private static void method4() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //获取class对象
        Class<Student> class1 = Student.class;
        //调用实例化方法   -- 需要重写toString()  不然返回的是地址值
        Student s = class1.newInstance();
        //上面这句就是 new 了一个对象   同样会触发无参构造
        System.out.println("s="+s);

        //怎么触发含参构造  --先指定
         //触发 Student(String name)
        Constructor<Student> c =  class1.getConstructor(String.class);
        Student st = c.newInstance("jack");
        System.out.println(st);
        //触发 Student(String name, int age)
        Constructor<Student> c1 = class1.getConstructor(String.class,int.class);
        Student st1 = c1.newInstance("Loser",23);
        System.out.println(st1);
    }

    public static void method3() {
        Class class1 = Student.class;
        //获取所有的成员变量  -- 获取的资源必须是public 修饰的
        Field[] md = class1.getFields();
        for (Field ad:md){
            //属性名称
            System.out.println(ad.getName());
            //属性类型
            System.out.println(ad.getType().getName());
        }
    }
    //获取类对象的三种方法
    public static void method() throws ClassNotFoundException {
        Class class1 = Class.forName("com.tedu.demo.Student");
        Class class2 =  Student.class;
        Class class3 = new Student().getClass();
        System.out.println(class1);
        System.out.println(class2);
        System.out.println(class3);
    }
    public static void method1(){
        //获取构造方法Clas对象
        Class class4 = Student.class;
        //获取构造方法
        Constructor[] a = class4.getConstructors();

        for(Constructor d:a){
            //获取构造方法名字
            System.out.println(d.getName());
            //获取构造方法参数
            Class[] cs = d.getParameterTypes();
            System.out.println(Arrays.toString(cs));
        }

    }
    public static void method2(){
        //获取普通方法Clas对象
        Class class4 = Student.class;
        //获取方法
        Method[] a = class4.getMethods();

        for(Method d:a){
            //获取方法名字
            System.out.println(d.getName());
            //获取构造方法参数
            Class<?>[] cs = d.getParameterTypes();
            System.out.println(Arrays.toString(cs));
        }

    }
}
